package com.dubbo.spi;

import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * @ Author xsd
 * @ crate time 2020/8/27 9:48
 * @ 描述
 * zj: 约定一个目录，根据接口名去那个目录找到文件，文件解析得到实现类的全限定名，然后循环加载实现类和创建其实例
 *   ServiceLoader.load(service, cl) ->reload() -> new LazyIterator(service, loader) -> configs = loader.getResources(fullName)
 *      fullName：META-INF/services/com.dubbo.spi.Job -》
 *   缺点：Java SPI 在查找扩展实现类的时候遍历 SPI 的配置文件并且将实现类全部实例化、一个实现类初始化过程比较消耗资源且耗时，但是你的代码里面又用不上它，这就产生了资源的浪费
 *      Java SPI 无法按需加载实现类
 */
public class JobImpl implements Job {
    @Override
    public void say() {
        System.out.println("job come in....");
    }

    public static void main(String[] args) {
        ServiceLoader<Job> loader = ServiceLoader.load(Job.class);
        Iterator<Job> jobIterator = loader.iterator();
        while (jobIterator.hasNext()) {
            Job job = jobIterator.next();
            job.say();
        }
    }
}
